home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 8
/
FM Towns Free Software Collection 8.iso
/
t_os
/
artemis
/
artsrc2
/
gpsetbk.asm
< prev
next >
Wrap
Assembly Source File
|
1994-06-01
|
5KB
|
291 lines
; Rio's Graphic Library
;
; gpset.asm
;
; 1992.6.13(Sat)
public _gpset, gpset
extrn _gwrtreg:near
include grplib.inc
assume cs:cseg
dseg segment
px dd 0
py dd 0
pcol dd 0
plog dd 0
dseg ends
cseg segment
;---------------------------------------------------------------
; _gpset : 点の描画
; in AX,BX : 座標
; CX : 色
; DX : 演算指定(0=PSET 1=XOR)
;
; void gpset(int x, int y, int col, int mode)
;---------------------------------------------------------------
align 4
gpset proc
mov ax,[esp+4]
mov [px],ax
mov ax,[esp+8]
mov [py],ax
mov ax,[esp+12]
mov [pcol],ax
mov ax,[esp+16]
mov [plog],ax
push dword ptr offset #retp
mov al,[_nowscrmod]
cmp al,2
jle #nomode
cmp al,4
jle gpset_16
cmp al,8
jle gpset_32_1
cmp al,11
jle gpset_32_2
cmp al,14
jle gpset_256
cmp al,18
jle gpset_32_3
#nomode: ret
#retp: ret
gpset endp
align 4
gpset_16 proc
gpset_16 endp
gpset_32_1 proc
gpset_32_1 endp
gpset_32_2 proc
gpset_32_2 endp
gpset_256 proc
gpset_256 endp
gpset_32_3 proc
gpset_32_3 endp
push ebx
push esi
mov al,[_nowscrmod]
cmp al,2
jle #end
cmp al,4
jle #mode16
cmp al,8
jle #mode32K_256
cmp al,11
jle #mode32K_512
jmp #end
#mode16:
parmbase = 12
mov ax,[esp+parmbase+4] ;y
and eax,0ffffh
lea eax,[eax*8]
lea eax,[eax*8]
lea eax,[eax*8]
mov bx,[esp+parmbase] ;x
and ebx,0ffffh
mov ecx,ebx
shr ebx,1
add eax,ebx ;eax := アドレス
bt ecx,0
jnc #odd
#even: mov ebx,0fh ;mask
mov ecx,[esp+parmbase+8] ;color
and ecx,0fh
shl ecx,4
jmp #m16_l1
#odd: mov ebx,0f0h ;mask
mov ecx,[esp+parmbase+8] ;color
and ecx,0fh
#m16_l1: push ds
mov si,104h
mov ds,si
mov edx,[esp+parmbase+12] ;logop
or edx,edx
jnz #m16_xor
#m16_normal: mov dl,ds:[eax]
and dl,bl
or dl,cl
jmp #m16_l2
#m16_xor: mov dl,ds:[eax]
xor dl,cl
#m16_l2: mov ds:[eax],dl
pop ds
jmp #end
#mode32K_256:
parmbase = 12
mov ax,[esp+parmbase+4] ;y
and eax,0ffffh
lea eax,[eax*8]
lea eax,[eax*8]
lea eax,[eax*8]
jmp #mode32K_
#mode32K_512:
parmbase = 12
mov ax,[esp+parmbase+4] ;y
and eax,0ffffh
lea eax,[eax*8]
lea eax,[eax*8]
lea eax,[eax*8]
add eax,eax
#mode32K_:
mov bx,[esp+parmbase] ;x
and ebx,0ffffh
add ebx,ebx
add eax,ebx ;eax := address
push ds
parmbase = parmbase + 2
mov bx,120h
mov ds,bx
mov bx,[esp+parmbase+12] ;logop
or bx,bx
jnz #m32_xor
#m32_normal: mov bx,[esp+parmbase+8] ;col
mov ds:[eax],bx
jmp #m32_l1
#m32_xor: mov bx,[esp+parmbase+8]
xor ds:[eax],bx
#m32_l1: pop ds
jmp #end
#end:
pop esi
pop ebx
ret
; push ebx
; mov ax,[esp+8]
; mov bx,[esp+12]
; mov cx,[esp+16]
; mov dx,[esp+20]
; call _gpset
; pop ebx
; ret
gpset endp
align 4
_gpset proc
pushad
mov di,dx ;DI := 演算指定
mov si,cx ;SI := カラーコード
mov cl,[_nowscrmod]
cmp cl,2
jle #end
cmp cl,4
jle #mode0
cmp cl,8
jle #mode2
cmp cl,11
jle #mode1
jmp #end
#mode0: ; 《仮想画面 1024*512,16色モード》
mov ecx,eax
and ecx,7
lea ecx,[ecx*4] ;ESI := 書き込むピクセルデータ
shl esi,cl
mov ebp,1111b ;EBP := マスクパターン
shl ebp,cl
and ebx,0ffffh ;EBX := アドレス
lea ebx,[ebx*8]
lea ebx,[ebx*8]
lea ebx,[ebx*8]
and eax,0fff8h
shr eax,1
add ebx,eax
mov al,[_wrtpage]
or al,al
jz #mode0_page0
add ebx,40000h
#mode0_page0: ;
xor ax,ax ;マスクレジスタ書き込み
mov edx,ebp
call _gwrtreg
push ds ;VRAM 書き込み
mov ax,104h
mov ds,ax
or di,di ;(演算指定により分岐)
jnz #mode0_xor
mov ds:[ebx],esi
jmp #mode0_end
#mode0_xor: xor ds:[ebx],esi
#mode0_end: pop ds
jmp #end
#mode1: ; 《仮想画面 512*256,32768色モード》
and ebx,0ffffh ;EBX := アドレス
lea ebx,[ebx*8]
lea ebx,[ebx*8]
lea ebx,[ebx*8]
lea ebx,[ebx*2]
and eax,0ffffh
add eax,eax
add ebx,eax
mov al,[_wrtpage]
or al,al
jz #mode1_page0
add ebx,40000h
#mode1_page0: ;
push ds
mov ax,104h
mov ds,ax
or di,di
jnz #mode1_xor
mov ds:[ebx],si
jmp #mode1_end
#mode1_xor: xor ds:[ebx],si
#mode1_end: pop ds
jmp #end
#mode2: ; 《仮想画面 256*512,32768色モード》
and ebx,0ffffh ;EBX := アドレス
lea ebx,[ebx*8]
lea ebx,[ebx*8]
lea ebx,[ebx*8]
and eax,0ffffh
add eax,eax
add ebx,eax
mov al,[_wrtpage]
or al,al
jz #mode2_page0
add ebx,40000h
#mode2_page0: ;
push ds
mov ax,104h
mov ds,ax
or di,di
jnz #mode2_xor
mov ds:[ebx],si
jmp #mode2_end
#mode2_xor: xor ds:[ebx],si
#mode2_end: pop ds
#end: ; 後処理
popad
ret
_gpset endp
cseg ends
end